home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / WINPROGS / WINSRC20.ZIP / FPU087.ASM < prev    next >
Assembly Source File  |  1990-09-07  |  31KB  |  1,362 lines

  1. TITLE fpu087.asm (C) 1989, Mark C. Peterson, CompuServe [70441,3353]
  2. SUBTTL All rights reserved.
  3. ;
  4. ;  Code may be used in any program provided the author is credited
  5. ;    either during program execution or in the documentation.  Source
  6. ;    code may be distributed only in combination with public domain or
  7. ;    shareware source code.  Source code may be modified provided the
  8. ;    copyright notice and this message is left unchanged and all
  9. ;    modifications are clearly documented.
  10. ;
  11. ;    I would appreciate a copy of any work which incorporates this code.
  12. ;
  13. ;    Mark C. Peterson
  14. ;    253 West St., H
  15. ;    Plantsville, CT 06579
  16. ;    (203) 276-9474
  17. ;
  18. ;  References:
  19. ;     The VNR Concise Encyclopedia of Mathematics
  20. ;        by W. Gellert, H. Hustner, M. Hellwich, and H. Kastner
  21. ;        Published by Van Nostrand Reinhold Comp, 1975
  22. ;
  23. ;     80386/80286 Assembly Language Programming
  24. ;        by William H. Murray, III and Chris H. Pappas
  25. ;        Published by Osborne McGraw-Hill, 1986
  26. ;        
  27. ;
  28. ;
  29.  
  30. IFDEF ??version
  31. MASM51
  32. QUIRKS
  33. EMUL
  34. ENDIF
  35.  
  36. .model medium, c
  37.  
  38. extrn cos:far
  39. extrn _Loaded387sincos:far
  40. extrn compiled_by_turboc:word
  41.  
  42.  
  43. .data
  44.  
  45. extrn cpu:WORD
  46.  
  47. PUBLIC TrigLimit, TrigOverflow
  48.  
  49. PiFg13         dw       6487h
  50. InvPiFg33      dd       0a2f9836eh
  51. InvPiFg16      dw       517ch
  52. Ln2Fg16        dw       0b172h
  53. TrigOverflow   dw       0
  54. TrigLimit      dd       0
  55. one            dw       ?
  56. expSign        dw       ?
  57. a              dw       ?
  58. SinNeg         dw       ?
  59. CosNeg           dw    ?
  60. Ans           dq    ?
  61. fake_es        dw       ?         ; <BDT> Windows can't use ES for storage
  62.  
  63. TaylorTerm  MACRO
  64. LOCAL Ratio
  65.    add   Factorial, one
  66.    jnc   SHORT Ratio
  67.  
  68.    rcr   Factorial, 1
  69.    shr   Num, 1
  70.    shr   one, 1
  71.  
  72. Ratio:
  73.    mul   Num
  74.    div   Factorial
  75. ENDM
  76.  
  77.  
  78.  
  79. _4_         dq    4.0
  80. _2_         dq    2.0
  81. _1_         dq    1.0
  82. PointFive   dq    0.5
  83. temp        dq     ?
  84. Sign        dw     ?
  85.  
  86. extrn fpu:word
  87.  
  88. .code
  89.  
  90.  
  91. FPUcplxmul     PROC     x:word, y:word, z:word
  92.    mov   bx, x
  93.    fld   QWORD PTR [bx]       ; x.x
  94.    fld   QWORD PTR [bx+8]     ; x.y, x.x
  95.    mov   bx, y
  96.    fld   QWORD PTR [bx]       ; y.x, x.y, x.x
  97.    fld   QWORD PTR [bx+8]     ; y.y, y.x, x.y, x.x
  98.    mov   bx, z
  99.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  100.    fmul  st, st(3)            ; y.y*x.y, y.y. y.x, x.y, x.x
  101.    fld   st(2)                ; y.x, y.y*x.y, y.y, y.x, x.y, x.x
  102.    fmul  st, st(5)            ; y.x*x.x, y.y*x.y, y.y, y.x, x.y, x.x
  103.    fsubr                      ; y.x*x.x - y.y*x.y, y.y, y.x, x.y, x.x
  104.    fstp  QWORD PTR [bx]       ; y.y, y.x, x.y, x.x
  105.    fmulp st(3), st            ; y.x, x.y, x.x*y.y
  106.    fmul                       ; y.x*x.y, x.x*y.y
  107.    fadd                       ; y.x*x.y + x.x*y.y
  108.    fstp  QWORD PTR [bx+8]
  109.    ret
  110. FPUcplxmul     ENDP
  111.  
  112.  
  113.  
  114.  
  115.  
  116. FPUcplxdiv     PROC     x:word, y:word, z:word
  117.    mov   bx, x
  118.    fld   QWORD PTR [bx]       ; x.x
  119.    fld   QWORD PTR [bx+8]     ; x.y, x.x
  120.    mov   bx, y
  121.    fld   QWORD PTR [bx]       ; y.x, x.y, x.x
  122.    fld   QWORD PTR [bx+8]     ; y.y, y.x, x.y, x.x
  123.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  124.    fmul  st, st               ; y.y*y.y, y.y, y.x, x.y, x.x
  125.    fld   st(2)                ; y.x, y.y*y.y, y.y, y.x, x.y, x.x
  126.    fmul  st, st               ; y.x*y.x, y.y*y.y, y.y, y.x, x.y, x.x
  127.    fadd                       ; mod, y.y, y.x, x.y, x.x
  128.    fdiv  st(1), st            ; mod, y.y=y.y/mod, y.x, x.y, x.x
  129.    fdivp st(2), st            ; y.y, y.x=y.x/mod, x.y, x.x
  130.    mov   bx, z
  131.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  132.    fmul  st, st(3)            ; y.y*x.y, y.y. y.x, x.y, x.x
  133.    fld   st(2)                ; y.x, y.y*x.y, y.y, y.x, x.y, x.x
  134.    fmul  st, st(5)            ; y.x*x.x, y.y*x.y, y.y, y.x, x.y, x.x
  135.    fadd                       ; y.x*x.x - y.y*x.y, y.y, y.x, x.y, x.x
  136.    fstp  QWORD PTR [bx]       ; y.y, y.x, x.y, x.x
  137.    fmulp st(3), st            ; y.x, x.y, x.x*y.y
  138.    fmul                       ; y.x*x.y, x.x*y.y
  139.    fsubr                      ; y.x*x.y + x.x*y.y
  140.    fstp  QWORD PTR [bx+8]
  141.    ret
  142. FPUcplxdiv     ENDP
  143.  
  144.  
  145.  
  146. FPUcplxlog     PROC     x:word, z:word
  147. LOCAL Status:word
  148.    mov   bx, x
  149.    fld   QWORD PTR [bx+8]        ; x.y
  150.    fld   QWORD PTR [bx]          ; x.x, x.y
  151.    mov   bx, z
  152.    fldln2                        ; ln2, x.x, x.y
  153.    fdiv  _2_                     ; ln2/2, x.x, x.y
  154.    fld   st(2)                   ; x.y, ln2/2, x.x, x.y
  155.    fmul  st, st                  ; sqr(x.y), ln2/2, x.x, x.y
  156.    fld   st(2)                   ; x.x, sqr(x.y), ln2/2, x.x, x.y
  157.    fmul  st, st                  ; sqr(x.x), sqr(x.y), ln2/2, x.x, x.y
  158.    fadd                          ; mod, ln2/2, x.x, x.y
  159.    fyl2x                         ; z.x, x.x, x.y
  160.    fstp  QWORD PTR [bx]          ; x.x, x.y
  161.    cmp   fpu, 387
  162.    jne   Restricted
  163.  
  164.    fpatan
  165.    jmp   StoreZX
  166.  
  167. Restricted:
  168.    mov   bx, x
  169.    mov   dh, BYTE PTR [bx+7]
  170.    or    dh, dh
  171.    jns   ChkYSign
  172.  
  173.    fchs                          ; |x.x|, x.y
  174.  
  175. ChkYSign:
  176.    mov   dl, BYTE PTR [bx+8+7]
  177.    or    dl, dl
  178.    jns   ChkMagnitudes
  179.  
  180.    fxch                          ; x.y, |x.x|
  181.    fchs                          ; |x.y|, |x.x|
  182.    fxch                          ; |x.x|, |x.y|
  183.  
  184. ChkMagnitudes:
  185.    fcom  st(1)                   ; x.x, x.y
  186.    fstsw Status                  ; x.x, x.y
  187.    test  Status, 4500h
  188.    jz    XisGTY
  189.  
  190.    test  Status, 4000h
  191.    jz    XneY
  192.  
  193.    fstp  st                      ; x.y
  194.    fstp  st                      ; <empty>
  195.    fldpi                         ; Pi
  196.    fdiv  _4_                     ; Pi/4
  197.    jmp   ChkSignZ
  198.  
  199. XneY:
  200.    fxch                          ; x.y, x.x
  201.    fpatan                        ; Pi/2 - Angle
  202.    fldpi                         ; Pi, Pi/2 - Angle
  203.    fdiv  _2_                     ; Pi/2, Pi/2 - Angle
  204.    fsubr                         ; Angle
  205.    jmp   ChkSignZ
  206.  
  207. XisGTY:
  208.    fpatan
  209.  
  210. ChkSignZ:
  211.    or    dh, dh
  212.    js    NegX
  213.  
  214.    or    dl, dl
  215.    jns   StoreZX
  216.  
  217.    fchs
  218.    jmp   StoreZX
  219.  
  220. NegX:
  221.    or    dl, dl
  222.    js    QuadIII
  223.  
  224.    fldpi
  225.    fsubr
  226.    jmp   StoreZX
  227.  
  228. QuadIII:
  229.    fldpi
  230.    fsubr
  231.    fchs
  232.  
  233. StoreZX:
  234.    mov   bx, z
  235.    fstp  QWORD PTR [bx+8]        ; <empty>
  236.    ret
  237. FPUcplxlog     ENDP
  238.  
  239.  
  240.  
  241.  
  242. FPUsinhcosh    PROC     x:word, sinh:word, cosh:word
  243. LOCAL Control:word
  244.    fstcw Control
  245.    push  Control                       ; Save control word on the stack
  246.    or    Control, 0000110000000000b 
  247.    fldcw Control                       ; Set control to round towards zero
  248.  
  249.    mov   Sign, 0              ; Assume the sign is positive
  250.    mov   bx, x
  251.  
  252.    fldln2                     ; ln(2)
  253.    fdivr QWORD PTR [bx]       ; x/ln(2)
  254.  
  255.    cmp   BYTE PTR [bx+7], 0
  256.    jns   DuplicateX
  257.  
  258.    fchs                       ; x = |x|
  259.  
  260. DuplicateX:   
  261.    fld   st                   ; x/ln(2), x/ln(2)
  262.    frndint                    ; int = integer(|x|/ln(2)), x/ln(2)
  263.    fxch                       ; x/ln(2), int
  264.    fsub  st, st(1)            ; rem < 1.0, int
  265.    fdiv  _2_                  ; rem/2 < 0.5, int
  266.    f2xm1                      ; (2**rem/2)-1, int
  267.    fadd  _1_                  ; 2**rem/2, int
  268.    fmul  st, st               ; 2**rem, int
  269.    fscale                     ; e**|x|, int
  270.    fstp  st(1)                ; e**|x|
  271.  
  272.    cmp   BYTE PTR [bx+7], 0
  273.    jns   ExitFexp
  274.  
  275.    fdivr _1_                  ; e**x      
  276.  
  277. ExitFexp:
  278.    fld   st                   ; e**x, e**x
  279.    fdivr PointFive            ; e**-x/2, e**x
  280.    fld   st                   ; e**-x/2, e**-x/2, e**x
  281.    fxch  st(2)                ; e**x, e**-x/2, e**-x/2
  282.    fdiv  _2_                  ; e**x/2,  e**-x/2, e**-x/2
  283.    fadd  st(2), st            ; e**x/2,  e**-x/2, cosh(x)
  284.    fsubr                      ; sinh(x), cosh(x)
  285.  
  286.    mov   bx, sinh             ; sinh, cosh
  287.    fstp  QWORD PTR [bx]       ; cosh
  288.    mov   bx, cosh
  289.    fstp  QWORD PTR [bx]       ; <empty>
  290.  
  291.    pop   Control
  292.    fldcw Control              ; Restore control word
  293.    ret
  294. FPUsinhcosh    ENDP
  295.  
  296.  
  297. FPUsincos  PROC  x:word, sinx:word, cosx:word
  298. LOCAL Status:word
  299.    mov   bx, x
  300.    fl